<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>手写继承-寄生组合式继承</title>
</head>
<body>
    <script>
        // 6、寄生组合式继承
        // 通过借用构造函数继承属性，原型链的混成形式来继承方法
        function Father(sex){
            this.name="quan"
            this.do=["打游戏","刷抖音","等消息"]
            this.sex=sex
        }
        Father.prototype.sayHi=function(){
            console.log('Im '+this.name)
        }
        function Son(age,sex){
            // 在子类型构造函数的内部，调用超类型构造函数（核心思想）这里还可以传递参数了
            Father.call(this,sex)     
            this.age=age              // 写下面好一些，不然如果父类有同样的，会被覆盖
        }
        // 不必为了指定子类型的原型而调用超类型的构造函数，我们做需要的无非就是超类型原型的一个副本（核心思想）
        // 实现继承方法的函数
        function inheritPrototype(Son,Father){
            // 方法一
            let quan=object(Father.prototype)      //quan是Father.prototype的实例，是Son的原型
            // 方法二（ES5）
            // let quan=Object.create(Father)      //这里就是Son1以Father作为原型，也可以传null，就是没有原型
            console.log(quan.constructor)          //改变之后指向Father
            quan.constructor=Son                   //手动改为Son
            console.log(quan.constructor)          //手动改正之后指向Son
            Son.prototype=quan                     //quan是Father.prototype的实例就有Father.prototype所有属性和方法，然后等于Son.prototype，相当于实现了一个原型的替换
        }
        // 实现拷贝的函数
        function object(o){
            function F() {}
            F.prototype=o
            return new F()//返回新实例
        }
        inheritPrototype(Son,Father)
        Son.prototype.sayAge=function(){
            console.log('Im '+this.age)
        }
        let instance1=new Son(21,'男')   //可以传递参数到超类型构造函数
        console.log(instance1.age)       // 21
        console.log(instance1.name)      // quan
        console.log(instance1.sex)       // 男
        instance1.sayHi()                // Im quan
        instance1.sayAge()               // Im 21
        let instance2=new Son(18,'女')
        instance2.sayAge()               // Im 18
        console.log(instance2.sex)       // 女
        instance2.do.push("看直播")
        console.log(instance1.do)        // ["打游戏","刷抖音","等消息"]
        console.log(instance2.do)        // ["打游戏","刷抖音","等消息","看直播"]
    </script>
</body>
</html>